# -*- coding: utf-8 -*-

{%- set uses_sqlite = cookiecutter.use_sql_sqlite in ('y', 'yes') -%}  {# 是否使用SQLite #}
{%- set uses_mysql = cookiecutter.use_sql_mysql in ('y', 'yes') -%}    {# 是否使用MySQL #}
{%- set uses_sql = uses_mysql or uses_sqlite -%}   {# 是否使用任何SQL数据库 #}
{%- set uses_socketio = cookiecutter.use_socketio in ('yes', 'y') -%}  {# 是否启用SocketIO #}
{%- set uses_static_files = cookiecutter.serve_static_files in ('yes', 'y') -%}  {# 是否提供静态文件服务 #}
{%- set use_email = cookiecutter.use_email in ('yes', 'y') -%}  {# 是否使用邮箱服务 #}
import os
import logging
from datetime import timedelta
from typing import Dict, List

# 项目名称
project_name = "{{ cookiecutter.repo_name }}"

# 数据库连接URI模板（根据选择的数据库类型动态设置）
{%- if uses_mysql %}
# MySQL数据库连接模板（使用mysqldb驱动）
SQLALCHEMY_DATABASE_URI_TMPL = "mysql+mysqldb://%(user)s:%(passwd)s@%(host)s/%(name)s"
{%- elif uses_sqlite %}
# SQLite数据库连接模板（存储在/tmp目录）
SQLALCHEMY_DATABASE_URI_TMPL = "sqlite:////tmp/%(name)s.sqlite"
{% endif %}

class Config(object):
    """基础配置类（所有环境的默认配置）"""
    
    # Flask基础配置
    ENV = os.getenv('FLASK_ENV', 'production')  # 运行环境（默认生产环境）
    DEBUG = os.getenv('FLASK_DEBUG', '0') == '1'  # 调试模式（通过环境变量控制）
    TESTING = False  # 测试模式
    USE_X_SENDFILE = False  # 是否使用X-Sendfile特性

    # 服务器网络配置
    HOST = os.getenv('HOST', '')  # 服务器主机地址
    HOST_PORT = os.getenv('HOST_PORT', '')  # 服务器端口
    SERVER_NAME_EXTRA = len(HOST_PORT) and '' or (":" + HOST_PORT)  # 端口拼接处理
    SERVER_NAME = HOST + SERVER_NAME_EXTRA  # 完整的服务器名称

    {%- if uses_sql %}
    # ====================== 数据库配置 ======================
    # 从环境变量获取数据库连接参数
    DB_USER = os.getenv('DB_USER', '')  # 数据库用户名
    DB_PASS = os.getenv('DB_PASS', '')  # 数据库密码
    DB_HOST = os.getenv('DB_HOST', '')  # 数据库主机地址
    DB_NAME = os.getenv('DB_NAME', '')  # 数据库名称

    # 动态生成数据库连接URI
    SQLALCHEMY_DATABASE_URI = SQLALCHEMY_DATABASE_URI_TMPL % {
        'user': DB_USER,
        'passwd': DB_PASS,
        'host': DB_HOST,
        'name': DB_NAME
    }

    SQLALCHEMY_BINDS: Dict = {}  # 多数据库绑定配置
    SQLALCHEMY_ECHO = DEBUG  # 是否输出SQL语句（调试模式下开启）
    SQLALCHEMY_TRACK_MODIFICATIONS = False  # 关闭对象修改跟踪（提高性能）
    {%- endif %}

    # ====================== 安全配置 ======================
    WTF_CSRF_ENABLED = True  # 启用CSRF保护
    SECRET_KEY = os.getenv("FLASK_SECRET_KEY", "secret")  # 加密密钥

    # ====================== 日志配置 ======================
    LOGGER_NAME = "%s_log" % project_name  # 日志记录器名称
    LOG_FILENAME = "/var/tmp/app.%s.log" % project_name  # 日志文件路径
    LOG_LEVEL = logging.INFO  # 日志级别
    LOG_FORMAT = "%(asctime)s %(levelname)s\t: %(message)s"  # 日志格式

    # ====================== 会话配置 ======================
    PERMANENT_SESSION_LIFETIME = timedelta(days=7)  # 会话有效期（7天）

    {%- if use_email %}
    # ====================== 邮件配置 ======================
    MAIL_DEBUG = DEBUG  # 邮件调试模式
    MAIL_SERVER = os.getenv("FLASK_MAIL_SERVER", "localhost")  # 邮件服务器
    MAIL_PORT = int(os.getenv("FLASK_MAIL_PORT", "25"))  # 邮件端口
    MAIL_USE_TLS = os.getenv("FLASK_MAIL_USE_TLS", "") == "1"  # 启用TLS
    MAIL_USE_SSL = os.getenv("FLASK_MAIL_USE_SSL", "") == "1"  # 启用SSL
    MAIL_USERNAME = os.getenv("FLASK_MAIL_USERNAME", None)  # 邮件用户名
    MAIL_PASSWORD = os.getenv("FLASK_MAIL_PASSWORD", None)  # 邮件密码
    DEFAULT_MAIL_SENDER = os.getenv(
        "FLASK_DEFAULT_MAIL_SENDER",
        "example@%s.com" % project_name
    )  # 默认发件人
    {%- endif %}

    # ====================== 模块加载配置 ======================
    # 自动加载的模块扩展名列表
    LOAD_MODULES_EXTENSIONS = ['views', 'models', 'admin', 'api', 'schemas']

    # ====================== 扩展模块配置 ======================
    EXTENSIONS = [
        {%- if uses_sql %}
        'extensions.db',      # SQLAlchemy数据库扩展
        'extensions.migrate', # 数据库迁移扩展
        {%- endif %}
        {%- if cookiecutter.use_security in ('yes', 'y') %}
        'extensions.security',# 安全扩展（如Flask-Security）
        {%- endif %}
        {%- if cookiecutter.use_admin in ('yes', 'y') %}
        'extensions.admin',   # 管理后台扩展
        {%- endif %}
        {%- if cookiecutter.use_rest in ('yes', 'y') %}
        'extensions.ma',      # REST API扩展（如Marshmallow）
        {%- endif %}
        {%- if uses_socketio %}
        'extensions.io',      # SocketIO扩展
        {%- endif %}
        {%- if uses_static_files %}
        'extensions.compress',# 静态文件压缩扩展
        {%- endif %}
    ]

    # 蓝图注册列表
    BLUEPRINTS: List = []


class Dev(Config):
    """开发环境专用配置"""
    # 开启邮件调试模式
    MAIL_DEBUG = True  
    
    # 添加开发工具扩展（如DebugToolbar）
    EXTENSIONS = Config.EXTENSIONS + ['extensions.toolbar']
    
    # 使用SQLite作为开发数据库
    SQLALCHEMY_DATABASE_URI = 'sqlite:////tmp/%s.db' % Config.DB_NAME


class Test(Config):
    """测试环境专用配置"""
    TESTING = True  # 启用测试模式
    WTF_CSRF_ENABLED = False  # 禁用CSRF保护（方便测试）

    {%- if uses_sql %}
    # 测试数据库配置（使用独立数据库）
    SQLALCHEMY_ECHO = False  # 关闭SQL日志输出
    SQLALCHEMY_DATABASE_URI = SQLALCHEMY_DATABASE_URI_TMPL % {
        'user': Config.DB_USER,
        'passwd': Config.DB_PASS,
        'host': Config.DB_HOST,
        'name': "%s-test" % Config.DB_NAME  # 使用带-test后缀的数据库
    }
    {%- endif %}